package org.example.chapter4.intercept;

import org.example.chapter4.invoke.Invocation;

import java.lang.reflect.InvocationTargetException;

/**
 * @author CoderXshuai
 * @date 2020/7/26/0026 13:56
 */

public interface Interceptor {
    /**
     * 事前方法
     *
     * @return
     */
    boolean before();

    /**
     * 事后方法
     */
    void after();

    /**
     * 取代原有事件方法
     *
     * @param invocation -- 回调参数,可以通过它的proceed方法,回调原有事件
     * @return 原有事件返回对象
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    Object around(Invocation invocation) throws Throwable;

    /**
     * 事后返回方法,事件没有发生异常执行
     */
    void afterReturning();

    /**
     * 事件异常方法,当事件发生异常后执行
     */
    void afterThrowing();

    /**
     * 是否使用around方法取代原有方法
     *
     * @return
     */
    boolean userAround();
}
